package com.aiwiown.face.domain.pc;

import com.aiwiown.face.ApiObject;
import com.aiwiown.face.domain.compare.FaceGenuineness;
import com.aiwiown.face.domain.compare.IdExceptions;
import com.aiwiown.face.domain.compare.RiskAssessment;
import com.aiwiown.face.internal.mapping.ApiField;

/**
 * <pre>
 * 活体检测结果；如果用户中途中断了活体流程，则此字段不返回。
 * </pre>
 * LivenessResult
 * Date: 2020/5/12 0026
 * Time: 11:13
 *
 * @author tang.xiaosheng@qq.com
 */
public class VerifyResult extends ApiObject {
    private static final long serialVersionUID = 4607032930517083802L;


    @ApiField("request_id")
    private String requestId;

    /**
     * KYC验证时的综合分数。此字段只在接口被成功调用时返回。
     */
    @ApiField("result_faceid")
    private RiskAssessment resultFaceid;

    /**
     * 用户上传的参考人脸照片（对应参数image_ref[y]）与待验证人脸照的比对结果。至多有三组，分别为result_ref1、result_ref2、result_ref3，这取决于image_ref[y]的个数。
     * <p>
     * 此对象包含的字段与result_faceid的一致，请参考对应的描述。
     * <p>
     * 此字段只在接口被成功调用时返回。
     */
    @ApiField("result_ref1")
    private RiskAssessment resultRef1;
    @ApiField("result_ref2")
    private RiskAssessment resultRef2;
    @ApiField("result_ref3")
    private RiskAssessment resultRef3;

    /**
     * 该字段表示待比对的脸的真实性。“真实的人脸”是指待比对的人脸图像是真实人脸的拍摄，而不是戴面具的脸、通过软件人工合成的脸、或是屏幕翻拍回放的脸。本字段返回真实性检查结果以及用作参考的相关阈值。
     * <p>
     * 仅当待比对照为来自MegLive模块时（face_image_type == "meglive" OR "meglive_flash"）才返回此对象。本对象包括如下字段：
     * <p>
     * synthetic_face_confidence：Float类型，取值［0，1］，表示人脸照片为软件合成脸的置信度。
     * synthetic_face_threshold：Float类型，取值［0，1］，表示人脸照片为软件合成脸的置信度阈值。 如果synthetic_face_confidence < synthetic_face_threshold，可以认为人脸不是软件合成脸。
     * mask_confidence：Float类型，取值［0，1］，表示人脸照片为面具的置信度。
     * mask_threshold：Float类型，取值［0，1］，表示人脸照片为面具的置信度阈值。 如果mask_confidence < mask_threshold，可以认为人脸不是面具。
     * screen_replay_confidence：Float类型，取值［0，1］，表示人脸照片为屏幕翻拍的置信度。注意：此字段只有在调用时传入了image_env参数才返回。
     * screen_replay_threshold：Float类型，取值［0，1］，表示人脸照片为屏幕翻拍的置信度阈值。 如果screen_replay_confidence < screen_replay_threshold，可以认为人脸不是屏幕翻拍。注意：此字段只有在调用时传入了image_env参数才返回。（face_image_type == "meglive_flash" 不返回此字段）
     */
    @ApiField("face_genuineness")
    private FaceGenuineness faceGenuineness;

    /**
     * 本对象返回身份相关的异常情况，如证件号码是否曾被冒用来攻击FaceID活体检测、参考数据人像照片是否存在质量不佳等问题。调用者可通过此对象增进对比对结果的解读。
     * <p>
     * 本对象仅在KYC验证时（comparison_type == 1)返回，返回包含如下字段：
     * <p>
     * "id_attacked"：Int类型，判别证件号码是否曾被冒用来攻击FaceID活体检测，取值1表示曾被攻击、取值0表示未被攻击。攻击形态包括但不限于戴面具、换人攻击、软件3D合成人脸等手段。若被判别为“是”，则有可能这个证件证号码目前存在被利用的风险。注意：判别为“是”不意味身份持有者本人参与攻击，有可能其身份被他人盗用而本人无感知。
     * "id_photo_monochrome"：Int类型，参考数据人像照片的色彩判断，取值1表示是黑白照片、取值0表示是彩色照片。参考数据存在一部分人像照片是黑白的现象，黑白的照片会影响比对质量，一般来说将降低比对分数。本字段表达这样的异常。
     */
    @ApiField("id_exceptions")
    private IdExceptions idExceptions;

    @ApiField("time_used")
    private Integer timeUsed;

    public String getRequestId() {
        return requestId;
    }

    public void setRequestId(String requestId) {
        this.requestId = requestId;
    }

    public RiskAssessment getResultFaceid() {
        return resultFaceid;
    }

    public void setResultFaceid(RiskAssessment resultFaceid) {
        this.resultFaceid = resultFaceid;
    }

    public RiskAssessment getResultRef1() {
        return resultRef1;
    }

    public void setResultRef1(RiskAssessment resultRef1) {
        this.resultRef1 = resultRef1;
    }

    public RiskAssessment getResultRef2() {
        return resultRef2;
    }

    public void setResultRef2(RiskAssessment resultRef2) {
        this.resultRef2 = resultRef2;
    }

    public RiskAssessment getResultRef3() {
        return resultRef3;
    }

    public void setResultRef3(RiskAssessment resultRef3) {
        this.resultRef3 = resultRef3;
    }

    public FaceGenuineness getFaceGenuineness() {
        return faceGenuineness;
    }

    public void setFaceGenuineness(FaceGenuineness faceGenuineness) {
        this.faceGenuineness = faceGenuineness;
    }

    public IdExceptions getIdExceptions() {
        return idExceptions;
    }

    public void setIdExceptions(IdExceptions idExceptions) {
        this.idExceptions = idExceptions;
    }

    public Integer getTimeUsed() {
        return timeUsed;
    }

    public void setTimeUsed(Integer timeUsed) {
        this.timeUsed = timeUsed;
    }

}
